﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MREO.data;
using System.Data.SqlServerCe;
using System.Diagnostics;

namespace MREO.gui
{
    public partial class fGVal : Form
    {
        public string tabKey;

        Connection Conn = new Connection();
        SqlCeDataAdapter adapter = new SqlCeDataAdapter();
        SqlCeCommand command = null;

        DataTable oldDt = new DataTable();

        public fGVal()
        {
            InitializeComponent();

            loadData();
        }

        private void loadData()
        {
            DataTable dt = new DataTable();

            try
            {
                dt = GValues.getGvalData();
            }
            catch (Exception exc) { MessageBox.Show(exc.Message); }

            oldDt = dt.Copy();

            dataGridView_gval.AutoGenerateColumns = false;
            dataGridView_gval.DataSource = dt;
            dataGridView_gval.Columns["id"].DataPropertyName = "id";
            dataGridView_gval.Columns["xname"].DataPropertyName = "xname";
            dataGridView_gval.Columns["xvalue"].DataPropertyName = "xvalue";
            dataGridView_gval.Columns["xdescription"].DataPropertyName = "xdescription";
        }

        private void button_save_Click(object sender, EventArgs e)
        {
            // Проверяем нет ли среди удаляемых пунктов тех которые используются в шаблонах
            if (checkTemplateParam())
            {
                MessageBox.Show("Удаленный параметр используется в шаблоне");
                return;
            }

            saveParam();

        }

        private void saveParam()
        {
            try
            {
                Conn.con.Open();

                command = new SqlCeCommand("DELETE FROM gval"
                                            , Conn.con);
                command.ExecuteNonQuery();


                command.CommandText = "INSERT INTO gval(xname, xvalue, xdescription) " +
                                            " VALUES(@xname, @xvalue, @xdescription)";
                
                for (int i = 0; i < dataGridView_gval.Rows.Count - 1; i++)
                {
                    command.Parameters.Clear();
                    command.Parameters.Add("@xname", SqlDbType.NVarChar).Value = dataGridView_gval.Rows[i].Cells["xname"].Value.ToString();
                    command.Parameters.Add("@xvalue", SqlDbType.NVarChar).Value = dataGridView_gval.Rows[i].Cells["xvalue"].Value.ToString();
                    command.Parameters.Add("@xdescription", SqlDbType.NVarChar).Value = dataGridView_gval.Rows[i].Cells["xdescription"].Value.ToString();
                    command.ExecuteNonQuery();
                }
                                            
                
            }
            catch (Exception exc) { MessageBox.Show(exc.Message); return; }
            finally
            {
                command.Dispose();
                adapter.Dispose();
                if (Conn.con.State == ConnectionState.Open)
                    Conn.con.Close();
            }

            MessageBox.Show("Данные сохранены");
        }

        /// <summary>
        /// Принимаю за эталон изначально загруженный набор данных.
        /// Если вижу, что из предыдущего набора была удалена запись
        /// проверяю не используется ли она в шаблоне.
        /// </summary>
        private bool checkTemplateParam()
        {
            bool ckeckName = false;                             // Признак присудствия записи
            List<string> strWhere = new List<string>();         // Список измененных записей
            StringBuilder foundError = new StringBuilder();     

            string strCheck = string.Empty;

            DataTable newDt = new DataTable();
            newDt = (DataTable)dataGridView_gval.DataSource;

            // Определяем удаленные имена
            for (int i = 0; i < oldDt.Rows.Count; i++)
            {
                strCheck = oldDt.Rows[i]["xname"].ToString();
                for (int j = 0; j < dataGridView_gval.Rows.Count - 1; j++) // -1 - последняя пустая строка
                {
                    // Если запись имеется в обоищ наборах - переходим на след итерацию
                    if (strCheck.Equals(dataGridView_gval.Rows[j].Cells["xname"].Value.ToString()))
                    {
                        ckeckName = true;
                        continue;
                    }
                }

                // Запись не обнаружена в новом наборе
                if (!ckeckName)
                {
                    ckeckName = false;
                    strWhere.Add(strCheck);
                }
            }

            // Нашлись записи удаленные из изначального набора
            // Проверяем используются ли они в параметрах шаблона
            if (strWhere.Count > 0)
            {
                foreach(string str in strWhere)
                    foreach(String strFound in getTemplateForParam(str))
                        foundError.AppendLine(strFound);
            }

            if (foundError.Length > 0)
            {
                MessageBox.Show(foundError.ToString());
                return true;
            }

            return false;
        }


        private List<string> getTemplateForParam(string str)
        {
            List<string> retVal = new List<string>();
            DataTable dt = new DataTable();

            try
            {
                Conn.con.Open();

                command = new SqlCeCommand("SELECT tp.xname, mi.doc_name " +
                                            " FROM templateParam tp" +
                                            " INNER JOIN mnuItems mi ON mi.id = tp.mnuItems" +
                                            " WHERE tp.xname = @str"
                                            , Conn.con);
                command.Parameters.Add("@str", SqlDbType.NVarChar).Value = str;
                adapter.SelectCommand = command;
                adapter.Fill(dt);
            }
            catch (Exception exc) { throw new Exception(exc.Message); }
            finally
            {
                command.Dispose();
                adapter.Dispose();
                if (Conn.con.State == ConnectionState.Open)
                    Conn.con.Close();
            }

            foreach (DataRow dr in dt.AsEnumerable())
                retVal.Add(dr["xname"].ToString() + ": " + dr["doc_name"].ToString());

            return retVal;
        }
    }
}
